package main

import "fmt"

/*
1、接口：
按顺序，应该讲解多态，讲解多态前，需要讲解接口，因为在go中多态特性主要是通过接口来体现的
2、为什么需要接口
类比USB接口的好处，高内聚，低耦合
*/
//声明/定义一个接口
type Usb interface {
	//声明了两个没有实现的方法
	Start()
	Stop()
}
type Phone struct {
}

//让Phone实现Usb接口的方法
func (p Phone) Start() {
	fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
	fmt.Println("手机停止工作...")
}

//让Camera实现Usb接口的方法
type Camera struct {
}

//让Camera实现Usb接口的方法
func (p Camera) Start() {
	fmt.Println("相机开始工作...")
}
func (p Camera) Stop() {
	fmt.Println("相机停止工作...")
}

//计算机
type Computer struct {
}

//编写一个方法Working，接收一个Usb接口类型变量
//只要是实现了Usb接口，所谓实现Usb接口，就是指实现了Usb接口声明的所有的方法
func (c Computer) Working(usb Usb) { //usb变量会根据传入的实参，来判断到底是Phone还是Camera，usb接口变量就体现出多态的特点
	//通过usb接口变量来调用Start和Stop方法
	usb.Start()
	usb.Stop()
}
func main() {
	//测试
	//先创建结构体变量
	computer := Computer{}
	phone := Phone{}
	camera := Camera{}
	//关键点
	computer.Working(phone)
	computer.Working(camera)
}
